// 登录与注册功能的代码实现
// 导入数据库db
const db = require('../db/index.js')
// 导入bcrypt加密中间件
const bcrypt = require('bcryptjs')
// 导入jwt，用于生成token
const jwt = require('jsonwebtoken')
// 导入jwt配置文件，用于加密跟解密
const jwtconfig = require('../jwt_config/index.js')

// 注册功能的代码实现
exports.register = (req,res) => {
	// req是前端传过来的数据，res是后端返回给前端的
	const reginfo = req.body
	// 第一步，判断前端传过来的数据有没有空
	if(!reginfo.account||!reginfo.password) {
		return res.send({
			status:1,
			message:'账号或者密码不能为空'
		})
	}
	// 第二步 判断前端传过来的数据account有没有已经存在数据表中
	// 需要使用mysql的select语句
	const sql = 'select * from users where account = ?'
	// 第一个参数是执行语句，第二个是前端传过来的参数，第三个是函数，用来处理结果
	db.query(sql,reginfo.account,(err,results) => {
		if(results.length>0) {
			return res.send({
				status:1,
				message: '账号已经存在'
			})
		}
		// 第三步 对密码password进行加密
		// 需要使用加密中间件：bcrypt.js
		// bcrypt.hashSync第一个参数是传入的密码，第二个是加密长度
		reginfo.password = bcrypt.hashSync(reginfo.password,10)
		// 第四步，把账号和密码插入到users表里面
		const sql1 = 'insert into users set ?'
		// 注册身份
		const identity = '用户'
		// 创建时间
		const create_time = new Date()
		db.query(sql1,{
			account:reginfo.account,
			password: reginfo.password,
			// 身份
			identity,
			// 创建时间
			create_time,
			// 初始未冻结状态为0
			status:0
		},(err,results) => {
			 // 插入失败，影响行数如果不是1，说明失败，插入失败，没有影响到行数
			 if(results.affectedRows !== 1) {
				 return res.send({
					 status:2,
					 message: '注册账号失败'
				 })
			 } 
			 res.send({
				 status:1,
				 message: '注册账号成功'
			 })
		})
	})

}
// 登录功能的代码实现
exports.login = (req,res) => {
	// 接收前端传过来的参数
	const loginfo = req.body
	// 第一步，查看数据表中有没有前端传过来的账号
	const sql = 'select * from users where account = ?'
	// 执行查找语句
	db.query(sql,loginfo.account,(err,results) => {
		// 调用注册的错误中间件，提醒执行sql语句失败的报错（一般在数据库断开的情况）
		if(err) return res.cc(err)
		// 查看数据表中有没有前端传过来的账号
		if(results.length!==1) return res.cc('登录失败')
		// 对前端传过来的密码进行解密bcrypt
		// 使用bcrypt.compareSync()方法---第一个参数是前端传过来的密码，第二个是数据库里面的密码
		const compareResult = bcrypt.compareSync(loginfo.password,results[0].password)
		// 如果对比失败，则提示前端----登录失败
		if(!compareResult) {
			return res.cc('登录失败')
		}
		// 对账号是否冻结作判定
		if(results[0].status==1) {
			return res.cc('账号被冻结')
		}
		// 生成返回给前端的token
		// 剔除加密后的密码，头像，创建时间，更新时间
		const user = {
			...results[0],
			password: '',
			imageUrl: '',
			create_time: '',
			update_time: '',
		}
		// 设置token有效时长，有效期为7h
		const tokenStr = jwt.sign(user,jwtconfig.jwtSecretKey,{
			expiresIn: '7h'
		})
		// 返回token给前端
		res.send({
			results:results[0],
			status:0,
			message:'登录成功',
			token: 'Bearer ' + tokenStr,
		})
	})
}